package ar.republicagroup.gestion.services.impl;

import ar.republicagroup.gestion.dao.ChequeDAO;
import ar.republicagroup.gestion.entities.Cheque;
import ar.republicagroup.gestion.entities.ChequeEstado;
import ar.republicagroup.gestion.entities.ChequeTipo;
import ar.republicagroup.gestion.entities.Cliente;
import ar.republicagroup.gestion.entities.CuentaBanco;
import ar.republicagroup.gestion.services.ChequeEstadoServices;
import ar.republicagroup.gestion.services.ChequeServices;
import java.lang.reflect.Array;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import java.util.Map;
import javax.swing.table.DefaultTableModel;

public class ChequeServicesImpl implements ChequeServices {
    
    static ChequeDAO chequeDao;

    public void setChequeDao(ChequeDAO chequeDao) {
        this.chequeDao = chequeDao;
    }

    @Override
    public List<Cheque> findEntities() {
       return chequeDao.findEntities();
    }
   

    @Override
    public String insert(Cheque beanCheque) {
       return chequeDao.insert(beanCheque);
    }

    @Override
    public String update(Cheque beanCheque) {
        return chequeDao.update(beanCheque);
    }

    @Override
    public Cheque get(Integer id_cheque) {
        return chequeDao.get(id_cheque);
    }

    @Override
    public String delete(Integer id_cheque) {
        return chequeDao.delete(id_cheque);
    }

    @Override
    public List<Cheque> getChequesByNumeroDeCheque(String numeroDeCheque) {
        return chequeDao.getChequesByNumeroDeCheque(numeroDeCheque);
    }

    @Override
    public List<Cheque> getChequesByImporte(double importe) {
        return chequeDao.getChequesByImporte(importe);
    }

    @Override
    public List<Cheque> getChequesByBolsaId(int bolsa_id) {
        return chequeDao.getChequesByBolsaId(bolsa_id);
    }

    @Override
    public String limpiarCodigoDeCheque(String codigoDeCheque) {
        String codigoSinLetras = "";
        
        for(int i=0; i < codigoDeCheque.length() ; i++){
            char caracter = codigoDeCheque.charAt(i);
             if(!Character.isAlphabetic(caracter)){
                codigoSinLetras = codigoSinLetras.concat(""+caracter);
             }
        }
        
        return codigoSinLetras;
        
    }

    @Override
    public Map<String, Object> getTotalesProvCap() {
        return chequeDao.getTotalesProvCap();
    }

    @Override
    public Map<String, Object> getLiquidacionesPosiblesPorCadaCliente(Calendar fechaLiquidacion) {
        return chequeDao.getLiquidacionesPosiblesPorCadaCliente(fechaLiquidacion);
    }

    @Override
    public List<Cheque> getChequesByFilters(ChequeTipo chequeTipo, ChequeEstado chequeEstado,CuentaBanco bancoEmisor,Calendar fechaAlta,String nroCheque,double importe) {
        return chequeDao.getChequesByFilters(chequeTipo, chequeEstado,bancoEmisor,fechaAlta,nroCheque,importe);
    }

    @Override
    public boolean isChequeRegistered(String codigoStringDeCheque) {
        return chequeDao.isChequeRegistered(codigoStringDeCheque);
    }

    @Override
    public Map<String, String> getChequeDataFromStringCode(String codigoChequeString) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public List<Cheque> cambiarEstadosDeCheques(DefaultTableModel table, int[] selectedCheques, ChequeEstado nuevoEstado) {
            List<Cheque> chequesToUpdateList = new ArrayList<>();
        
            for (int i=0; i < selectedCheques.length;i++){
                 Cheque cheque = (Cheque)table.getValueAt(selectedCheques[i], 2);
                 chequesToUpdateList.add(cheque);
            }
        
            for(Cheque cheque : chequesToUpdateList){
                cheque.setChequeEstadoId(nuevoEstado);
                chequeDao.update(cheque);
            }
            
        return null;  
    }
    /* Terminar de implementar */
    @Override
    public Cheque validarCodigoDeCheque(String codigoDeCheque) {
        
        Cheque cheque = new Cheque();
        
         /* DESCOMPONEMOS LA CADENA Y OBTENEMOS LOS CODIGOS RESPECTIVOS */
            cheque.setCodigoString(codigoDeCheque);
                   
            
            
        return null;
        
        /*
          String cod_cuenta_banco		= null;
		String cod_cuenta_sucursal	= null;
		String cod_postal 		= null;
		String nro_cheque               = null;
		String cuenta_bancaria		= null;
		String codigo_de_cheque 	= codigo_cheque_ingresado;
                
                    
                /* DESCOMPONEMOS LA CADENA Y OBTENEMOS LOS CODIGOS RESPECTIVOS */
//                cod_cuenta_banco                    = codigo_de_cheque.substring(0, 3);
//                cod_cuenta_sucursal                 = codigo_de_cheque.substring(3, 6);
//		cod_postal                          = codigo_de_cheque.substring(6,10);
//                nro_cheque                          = codigo_de_cheque.substring(10, 18);
//		cuenta_bancaria                     = codigo_de_cheque.substring(18);
         
        
    }

    @Override
    public boolean isChequeUpdatedToday(Cheque cheque) {
        boolean updatedToday = true;
        
        /* Un cheque puede haber sido marcado pendiente antes de la liquidación y no tiene asignado una fecha de pendiente*/
        if(cheque.getFechaPendiente() != null){
        
        /*Seteamos los valores en 0 para solo comparar la FECHA , y no HH MM SS*/
        Date fechaPendiente = cheque.getFechaPendiente();
        fechaPendiente.setHours(0);
        fechaPendiente.setMinutes(0);
        fechaPendiente.setSeconds(0);
        
        Date hoy = new Date();
        hoy.setHours(0);
        hoy.setMinutes(0);
        hoy.setSeconds(0);
        
        
        if(fechaPendiente.getDate() <= hoy.getDate() && fechaPendiente.getMonth() <= hoy.getMonth() && fechaPendiente.getYear() <= hoy.getYear()){
           updatedToday = false;
            }
        }
        
        return updatedToday;
    }

    @Override
    public List<Object[]> getSumaDeChequesPorClienteDelDia(String fecha, String origenCheques) {
        return chequeDao.getSumaDeChequesPorClienteDelDia(fecha, origenCheques);
    }

    
    @Override
    public List<Cheque> cambiarDeFechaAltaAndComision(List<Cheque> chequeList, Cliente nuevoCliente, Date nuevaFechaAlta) {
        
        List<Cheque> chequeListUpdated = new ArrayList();
        
        for(Cheque cheque : chequeList){
            if(cheque.getOrigen().equals("VC")){
                cheque.setComision(nuevoCliente.getComisionInterior());
            }else{
                cheque.setComision(nuevoCliente.getComisionBa());
            }
            
            /* Eliminamos la 'E' de eliminada que está al final del código */
            cheque.setCodigoString(cheque.getCodigoString().substring(0, TAMANO_CODIGO_CHEQUE));
            cheque.setEstado(1);
            cheque.setFechaAlta(nuevaFechaAlta);
            chequeListUpdated.add(cheque);
        }
        
        return chequeListUpdated;
    }

    @Override
    public List<Integer> obtenerIdsFromChequeList(List<Cheque> chequeList) {
        
        List<Integer> chequeIdsList = new ArrayList();
        
        for( Cheque cheque : chequeList ){
            chequeIdsList.add(cheque.getId());
        }
        
        
        return chequeIdsList;
    }

    
}
